package com.zzyl.intercept;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.zzyl.base.ResponseResult;
import com.zzyl.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Description LoginInterceptor
 * @Author Lisheng Li
 * @Date 2025-09-01
 */
@Component
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
    //请求前拦截方法： 返回值为true代表放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("开始登录校验。。。");
        //3.不是放行资源，就要进行登录校验，获取请求头token
        //read 这里反而还得不到，为什么token在Authorization
        String userToken = request.getHeader("userToken");

        // 如果token为空，尝试从其他常见的请求头获取
        if (StrUtil.isEmpty(userToken)) {
            userToken = request.getHeader("Authorization");
        }
        // 如果token为"undefined"，则视为空值
        if ("undefined".equals(userToken)) {
            userToken = null;
        }

        //4.判断token是否不为空
        // if(token!=null && token!="")
        if (!StrUtil.isEmpty(userToken)) {
            try {
                //4.1 不为空，进行解析token，获取载荷
                Claims claims = JwtUtil.parseJWT("gzhm666",userToken);
                //4.2 获取载荷里面的用户名并打印
                String nickName = (String) claims.get("nickName");
                //4.3 解析合法，放行
                log.info("员工id为：{} 登录校验成功，放行允许访问资源路径：{}", nickName, request.getRequestURI());
                return true;//doFilter是Filter的放行方法
            } catch (Exception e) {
                e.printStackTrace();//异常打印给开发人员看
                log.error("解析token失败，失败原因：{}", e.getMessage());
            }
        }

        //5.token为空 或 解析报错 返回校验失败
        //5.1 设置响应状态码为401(这个401是与前端开发协商好，前端自动跳转到登录页面重新登录)
        response.setContentType("application/json;charset=utf-8");
        response.setStatus(401);//401就代表未认证，登录校验不通过
        //5.2 设置通用返回结果{"code":0,msg:"登录失效，请重新登录",data:null}
        // return Result.error("登录失效，请重新登录"); 这样不行的，因为规范当前接口没有返回值
        //创建通用结果对象封装错误友好消息
        ResponseResult result = ResponseResult.error("登录失效，请重新登录");
        //将对象转换为json字符串
        String json = JSONUtil.toJsonStr(result);
        //将json字符串输出给前端
        response.getWriter().write(json);
        log.error("登录校验失败。。。");
        return false;
    }
}
